<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de Relatório
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Relatorio extends Main {

    const SERIES_TYPE_LINE = 'line';
    const SERIES_TYPE_BAR = 'bar';
    const SERIES_TYPE_COLUMN = 'column';
    const SERIES_TYPE_SPLINE = 'spline';

    public $valor_zero = '00.00';

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema e se tem permissão para acessar relatórios
        $this->verificaLogado();

        //carrega class necessarias
        $this->load->model('DAORelatorio');
        $this->load->model('DAOEmprestimo');
        $this->load->library('highcharts');

        //Seta propriedades do template
        $arr_js = $this->config->item('js');
        array_push($arr_js, '../plugins/highcharts/highcharts');
        array_push($arr_js, '../plugins/highcharts/exporting');
        $this->template->load_js($arr_js);
        $this->template->set('title', 'Gerar Relatório || ' . $this->title);
        $this->template->set('page_title', 'Geração de Relatório');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Escolha o <span class="bold">TIPO DE RELATÓRIO E GRÁFICO</span> que deseja gerar, e selecione os filtros que aparecer ao tipo selecionado.</p>
                        <p>Será gerado o modo <span class="bold">GRÁFICO</span> e <span class="bold">TEXTO</span> do relatório.</p>');
    }

    public function index() {
        $this->listar();
    }

    public function listar($data = NULL) {
        try {
            $data['anos'] = $this->DAORelatorio->year_all();
            $relatorio = new TORelatorio();
            $data['tipos_relatorios'] = $relatorio->tipos_relatorios(FALSE);
            array_unshift($data['tipos_relatorios'], '====== Selecione o tipo de relatório ======');
            $data['meses'] = $relatorio->get_meses(FALSE);
            array_unshift($data['meses'], 'Todos os meses');
            $data['tipos_graficos'] = $relatorio->tipos_graficos(FALSE);

            $this->template->load(NULL, 'relatorio_list', $data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }

    /**
     * Verifica qual relatorio deve abrir
     * 
     */
    public function map_relatorio() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_RELATORIO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("tipo_relatorio", "Tipo de relatório", "trim|required|exact_lenght[1]|drop_no_zero|xss_clean");
            $this->form_validation->set_rules("tipo_grafico", "Tipo do gráfico", "trim|required|exact_lenght[1]|xss_clean");
            $this->form_validation->set_rules("ano_relatorio", "Ano", "trim|required|exact_lenght[4]|xss_clean");
            $this->form_validation->set_rules("mes_relatorio", "Mês", "trim|required|min_lenght[1]|xss_clean");
            $this->form_validation->set_rules("rotulo", "Rótulo", "trim|exact_lenght[4]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $tipo = $this->input->post('tipo_relatorio', TRUE);

                /** Tratando o ano * */
                $year = $this->input->post('ano_relatorio', TRUE);
                if ($year == 0) { // Todos os anos
                    $data_years = $this->DAORelatorio->year_all();
                    array_shift($data_years);
                    $year = implode(', ', $data_years);
                } elseif ($year == NULL) {
                    $year = date('Y');
                }

                /** Tratando o mês * */
                $month = $this->input->post('mes_relatorio', TRUE);
                if ($month == 0 || $month == NULL) { // Todos os meses
                    $month = implode(', ', $this->todos_meses);
                }

                $type_chart = $this->input->post('tipo_grafico', TRUE);
                
                /** Tratando parametros **/
                $param = array();
                $rotulo = $this->input->post('rotulo', TRUE) == NULL ? FALSE : TRUE;
                $param['rotulo'] = $rotulo;
                
                /** Monta gráfico de acordo com o tipo solicitado **/
                if ($tipo == TORelatorio::HISTORICO_EMPRESTIMOS) {
                    $this->history_loan($year, $month, $type_chart, $param);
                } elseif ($tipo == TORelatorio::HISTORICO_ITENS_EMPRESTIMO) {
                    $this->history_itens_loan($year, $month, $type_chart, $param);
                } elseif ($tipo == TORelatorio::HISTORICO_MULTA) {
                    $this->history_fine($year, $month, $type_chart, $param);
                } elseif ($tipo == TORelatorio::ITENS_MAIS_EMPRESTADOS) {
                    $this->itens_more_loan($year, $month, $type_chart, $param);
                } elseif ($tipo == TORelatorio::USUARIOS_MAIS_EMPRESTIMOS) {
                    $this->history_user_actives($year, $month, $type_chart, $param);
                } elseif ($tipo == TORelatorio::USUARIOS_MAIS_MULTADOS) {
                    $this->history_user_multa($year, $month, $type_chart, $param);
                } else {
                    throw new ExceptionValidacao('Não há relatórios para o tipo escolhido');
                    $this->listar();
                }
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Histórico de empréstimos realizados durante ano, mes
     * 
     * @param int    $year         Ano da busca
     * @param int    $month        Mês da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function history_loan($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_loan = $this->DAORelatorio->get_amout_loan($year, $month);

            // Convert your data arrays by doing:
            $categories = $this->todos_meses_extenso;

            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Histórico de empréstimos no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }

            // Description of xAxis
            $oHighcharts->xAxis->categories = $categories;

            // If stacking, choose normal
            // $oHighcharts->plotOptions->column->stacking = HighchartsPlotOptionsColumn::HIGHCHARTS_PLOT_OPTIONS_COLUMN_STACKING_NORMAL;
            // These are your data
            $oHighcharts->series->addSerie(new HighchartsSerie('Empréstimos', $this->mount_data($data_loan)));

            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            $data['infor_chart'] = $this->mount_footer_itens($year, $month);

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }

    /**
     * Histórico de itens emprestados realizados durante ano, mes
     * 
     * @param int    $year         Ano da busca
     * @param int    $month        Mês da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function history_itens_loan($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_book = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_BOOK);
            $data_magazine = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_MAGAZINE);
            $data_midia = $this->DAORelatorio->get_amout_item_loan($year, $month, TOItem::TIPO_MIDIA);

            // Convert your data arrays by doing:
            $categories = $this->todos_meses_extenso;

            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Histórico de itens (livro, magazine, mídia) emprestados no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }

            // Description of xAxis
            $oHighcharts->xAxis->categories = $categories;

            // These are your data
            $oHighcharts->series->addSerie(new HighchartsSerie('Livro', $this->mount_data($data_book)));
            $oHighcharts->series->addSerie(new HighchartsSerie('Magazine', $this->mount_data($data_magazine)));
            $oHighcharts->series->addSerie(new HighchartsSerie('Mídia', $this->mount_data($data_midia)));

            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            $data['infor_chart'] = $this->mount_footer_itens($year, $month);

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }
    
    
   /**
     * Histórico de multas ATIVAS e INATIVAS
     * 
     * @param int    $year         Ano da busca
     * @param int    $month        Mês da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function history_fine($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_fine_active = $this->DAORelatorio->amout_sum_fine($year, $month, TRUE); // Valor a receber (Multa ATIVA)
            $data_fine_inactive = $this->DAORelatorio->amout_sum_fine($year, $month, FALSE); // Valor recebido (multa INATIVA)
            
            // Convert your data arrays by doing:
            $categories = $this->todos_meses_extenso;

            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Histórico de multa aplicada no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }

            // Description of xAxis
            $oHighcharts->xAxis->categories = $categories;
            
           // The formatter is a javascript callback
            $oHighcharts->tooltip->formatter = "function() { 
                return '<b>'+ this.x + '</b><br />' + this.series.name + ': R$ '+ Highcharts.numberFormat(this.y, 2); }";

            // These are your data
            $oHighcharts->series->addSerie(new HighchartsSerie('Valor recebido', $this->mount_data($data_fine_inactive), '#89a54e'));
            $oHighcharts->series->addSerie(new HighchartsSerie('Valor a receber', $this->mount_data($data_fine_active), '#aa4644'));
            
            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            
            $this->load->model('DAOMulta');
            $total_pago = $this->DAOMulta->sum_fine_period($month, $year, TOMulta::MULTA_INATIVA);
            $total_pago_all = $this->DAOMulta->sum_fine_period(NULL, NULL, TOMulta::MULTA_INATIVA);
            $total_nao_pago = $this->DAOMulta->sum_fine_period($month, $year, TOMulta::MULTA_ATIVA);
            $total_nao_pago_all = $this->DAOMulta->sum_fine_period(NULL, NULL, TOMulta::MULTA_ATIVA);
            
            /** Tratando os valores **/
            $total_pagto = $total_pago == NULL ? $this->valor_zero : $total_pago;
            $total_pagto_all = $total_pago_all == NULL ? $this->valor_zero : $total_pago_all;
            $total_no_pagto = $total_nao_pago == NULL ? $this->valor_zero: $total_nao_pago;
            $total_no_pagto_all = $total_nao_pago_all == NULL ? $this->valor_zero : $total_nao_pago_all;
            
            $data['infor_chart'] = "<h3>Totais no período selecionado</h3>
                <p><b>&#10004; Total arrecardado: </b><span>R$ $total_pagto</span></p>
                <p><b>&#10004; Total a receber: </b><span>R$ $total_no_pagto</span></p><br />
                <h3>Total geral</h3>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;<b>&#8618; Arrecardado (valor pago): </b><span>R$ $total_pagto_all</span><br/>
                &nbsp;&nbsp;&nbsp;&nbsp;<b>&#8618; A Receber (valor não pago): </b><span>R$ $total_no_pagto_all</span></p>";

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }
    
    
   /**
     * Histórico de usuarios mais ativos (que realizaram mais empréstimos) no ano
     * 
     * @param int    $year         Ano da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function history_user_actives($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_user_active = $this->DAORelatorio->history_user_active_loan($year, $month, 10);
            $data_order_by = $data_user_active;
            $total_data = count($data_user_active);
            
            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Usuários mais ATIVOS (que solicitaram mais empréstimos) no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }
            
            // Ordena os dados em ordem alfabetica descendente
            array_multisort($data_order_by, SORT_ASC);
            
            foreach ($data_order_by as $key => $value) {
                // These are your data
                $oHighcharts->series->addSerie(new HighchartsSerie($value->nome, array((int) $value->total)));
            }

            // Description of xAxis
            $total_data_m = $total_data < 10 ? string_fill($total_data,2, 0) : '10';
            $message_total_data = "Últimos $total_data_m usuários que solicitaram mais empréstimos";
            $oHighcharts->xAxis->categories = array("");
            
           // The formatter is a javascript callback
            $oHighcharts->tooltip->formatter = "function() { 
                return '<b>'+ this.series.name + '</b><br />Solicitou <b>' + this.y + ' empréstimo(s)' }";

            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            
            // Informações texto
            if ($data_user_active) {
                $data['infor_chart'] = "<h3>$message_total_data no período selecionado</h3>";
                foreach ($data_user_active as $key => $value_vez) {
                    $number = string_fill(++$key, 2, 0);
                    $usuario = $value_vez->nome . ' ' . $value_vez->sobrenome;
                    $total_loan = string_fill($value_vez->total, 2, 0);

                    $data['infor_chart'] .= "<p><b>$number - $usuario </b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8618; Total: <span> $total_loan</span></p>";
                }
            }

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }
    
    
    
   /**
     * Histórico de itens mais emprestados
     * 
     * @param int    $year         Ano da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function itens_more_loan($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_itens_active = $this->DAORelatorio->history_itens_active_loan($year, $month, 10);
            $data_order_by = $data_itens_active;
            $total_data = count($data_itens_active);
            
            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Itens mais emprestados no ano: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }
            
            // Ordena os dados em ordem alfabetica descendente
            array_multisort($data_order_by, SORT_ASC);
            
            foreach ($data_order_by as $key => $value) {
                // These are your data
                $oHighcharts->series->addSerie(new HighchartsSerie($value->titulo, array((int) $value->total)));
            }

            // Description of xAxis
            $total_data_m = $total_data < 10 ? string_fill($total_data,2, 0) : '10';
            $message_total_data = "Últimos $total_data_m itens mais emprestados";
            $oHighcharts->xAxis->categories = array("");
            
           // The formatter is a javascript callback
            $oHighcharts->tooltip->formatter = "function() { 
                return '<b>'+ this.series.name + '</b><br /><b>' + this.y + '</b>empréstimo(s)' }";

            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            
            // Informações texto
            if ($data_itens_active) {
                $data['infor_chart'] = "<h3>$message_total_data no período selecionado</h3>";
                foreach ($data_itens_active as $key => $value_vez) {
                    $number = string_fill(++$key, 2, 0);
                    $total_loan = string_fill($value_vez->total, 2, 0);

                    $data['infor_chart'] .= "<p><b>$number - {$value_vez->titulo} | " . strtoupper($value_vez->tipo) . "</b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8618; Total: <span> $total_loan</span></p>";
                }
            }

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }
    
    
   /**
     * Histórico de usuarios que mais sofreram multas no ano
     * 
     * @param int    $year         Ano da busca
     * @param string $type_chart   Tipo do gráfico
     * @param arary  $param        Parametros
     * @retun array  $data         Array contendo os valores para ser exibido na view
     */
    public function history_user_multa($year, $month, $type_chart = self::SERIES_TYPE_COLUMN, $param = NULL) {
        try {
            $data_user_loan = $this->DAORelatorio->history_user_fine($year, $month, 10);
            $data_order_by = $data_user_loan;
            $total_data = count($data_user_loan);
            
            
            // Start by adding a new reference object
            // and adding some configuration for the chart
            $oHighcharts = new Highcharts(new HighchartsChart('container', $type_chart));

            $oHighcharts->title = new HighchartsTitle("Usuários que mais sofreram multas: <h3>$year</h3>");
            $oHighcharts->subtitle = new HighchartsSubtitle(count(explode(',', $month)) == 12 ? 'de Janeiro à Dezembro' : 'Mês de ' . $this->get_name_month($month));

            /** config DATALabel * */
            if ($param['rotulo']) {
                if ($type_chart == self::SERIES_TYPE_LINE) {
                    $oHighcharts->plotOptions->line->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_SPLINE) {
                    $oHighcharts->plotOptions->spline->dataLabels->enabled = TRUE;
                } else if ($type_chart == self::SERIES_TYPE_BAR) {
                    $oHighcharts->plotOptions->bar->dataLabels->enabled = FALSE;
                } else {
                    $oHighcharts->plotOptions->column->dataLabels->enabled = TRUE;
                }
            }

            // Description of xAxis
            $total_data_m = $total_data < 10 ? string_fill($total_data,2, 0) : '10';
            $message_total_data = "Últimos $total_data_m usuários que sofreram mais multas";
            $oHighcharts->xAxis->categories = array("");
            
           // The formatter is a javascript callback
            $oHighcharts->tooltip->formatter = "function() { 
                return '<b>'+ this.series.name + '</b><br />Sofreu <b>' + this.y + ' multas' }";

            // Ordena os dados em ordem alfabetica descendente
            array_multisort($data_order_by, SORT_ASC);
            
            // These are your data
            foreach ($data_order_by as $key => $value) {
                $oHighcharts->series->addSerie(new HighchartsSerie($value->nome, array((int) $value->total)));
            }
            
            // Enjoy your new chart
            $data['chart'] = $oHighcharts->render();
            $data['chart'] .= '<div id="container" class="chart"> </div>';
            
            if ($data_user_loan != NULL) {
                $data['infor_chart'] = "<h3>$message_total_data no período selecionado</h3>";
                foreach ($data_user_loan as $key => $value_vez) {
                    $number = string_fill(++$key, 2, 0);
                    $usuario = $value_vez->nome . ' ' . $value_vez->sobrenome;
                    $total_loan = string_fill($value_vez->total, 2, 0);
                    $valor_u = string_fill($value_vez->valor, 2, 0);
                    $valor = $valor_u == NULL ? $this->valor_zero : $valor_u;
                    $data['infor_chart'] .= "<p><b>$number - $usuario </b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8618; <b>Total:</b> <span> $total_loan</span>  multa(s) | <b>Acumulado:</b> <span>R$ $valor</span></p>";
                }
            }

            $this->listar($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_relatorio();
        }
    }
    

    /**
     * Retorna array de 1 a 12 referente ao meses do ano com os valores preenchidos de acordo com a data passado como parametro.
     * - Cada valor é colocado no seu respectivo mês, caso não tenha valor o valor padrão é 0
     * 
     * @param type $data array de objeto
     * @return type
     */
    private function mount_data($data) {
        // Array contendo os meses do ano
        $data_meses = array(self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO,
            self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO, self::TAG_VAZIO);

        foreach ($data as $value) {
            switch (($value->mes - 1)) {
                case 0 : $data_meses[0]   = (float)$value->total;
                    continue;
                case 1 : $data_meses[1]   = (float)$value->total;
                    continue;
                case 2 : $data_meses[2]   = (float)$value->total;
                    continue;
                case 3 : $data_meses[3]   = (float)$value->total;
                    continue;
                case 4 : $data_meses[4]   = (float)$value->total;
                    continue;
                case 5 : $data_meses[5]   = (float)$value->total;
                    continue;
                case 6 : $data_meses[6]   = (float)$value->total;
                    continue;
                case 7 : $data_meses[7]   = (float)$value->total;
                    continue;
                case 8 : $data_meses[8]   = (int) $value->total;
                    continue;
                case 9 : $data_meses[9]   = (float)$value->total;
                    continue;
                case 10 : $data_meses[10] = (float)$value->total;
                    continue;
                case 11 : $data_meses[11] = (float)$value->total;
                    continue;
            }
        }

        return $data_meses;
    }

    /**
     * Retorna rodape par arelatorio
     * 
     * @param type $year
     * @param type $month
     * @return type
     */
    private function mount_footer_itens($year, $month) {
        /** Totais * */
        $total_loan_all = string_fill($this->DAOEmprestimo->amount_all_loan(), 4, 0);
        $total_loan = string_fill($this->DAORelatorio->amount_loan($year, $month), 4, 0);
        $total_itens_loan = string_fill($this->DAORelatorio->amount_itens_loan($year, $month), 4, 0);
        $total_itens_loan_all = string_fill($this->DAORelatorio->amount_itens_loan(), 4, 0);
        $total_book = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_BOOK), 4, 0);
        $total_book_all = string_fill($this->DAORelatorio->amount_itens_loan(NULL, NULL, TOItem::TIPO_BOOK), 4, 0);
        $total_magazine = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_MAGAZINE), 4, 0);
        $total_magazine_all = string_fill($this->DAORelatorio->amount_itens_loan(NULL, NULL, TOItem::TIPO_MAGAZINE), 4, 0);
        $total_midia = string_fill($this->DAORelatorio->amount_itens_loan($year, $month, TOItem::TIPO_MIDIA), 4, 0);
        $total_midia_all = string_fill($this->DAORelatorio->amount_itens_loan(NULL, NULL, TOItem::TIPO_MIDIA), 4, 0);

        return "<h3>Totais no período selecionado</h3>
                <p><b>&#10004; Empréstimos realizados: </b><span> $total_loan </span></p>
                <p><b>&#10004; Itens emprestados: </b><span> $total_itens_loan</span></p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;<b>&#8618; Livro: </b><span> $total_book</span> | <b>Magazine: </b><span> $total_magazine</span> | <b>Mídia: </b> <span> $total_midia</span></p><br />
                <h3>Total geral</h3>
                <p><b># Empréstimos: </b><span>$total_loan_all</span><br/>
                <p><b># Itens emprestados: </b><span>$total_itens_loan_all</span></p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;<b>&#8618; Livro: </b><span> $total_book_all</span> | <b>Magazine: </b><span> $total_magazine_all</span> | <b>Mídia: </b> <span> $total_midia_all</span></p><br />";
    }

    /**
     * Retorna os nomes dos meses
     * 
     * @param  array     $data_month     Array contendo os dados
     * @param  string    $separator      Separador que deverá organizar a string
     * @return string    Dados retornado formatado, separados pelo separador 
     */
    private function get_name_month($data_month, $separator = ', ') {
        $months = array();

        $data_month = explode(',', $data_month);
        foreach ($data_month as $month) {
            array_push($months, $this->todos_meses_extenso[$month - 1]);
        }

        return implode($separator, $months);
    }

    private function view_list_relatorio() {
        $this->template->load(NULL, 'relatorio_list');
    }

}
